/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *
 * This file is part of XBee-Arduino.
 *
 * XBee-Arduino is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * XBee-Arduino is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with XBee-Arduino.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <XBee.h>

#include "DHT.h"
#include "stdio.h"

#define DHTPIN 2     // temp / humidity pin
#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);



/*
This example is for Series 2 XBee
 Sends a ZB TX request with the value of analogRead(pin5) and checks the status response for success
 */

// create the XBee object
XBee xbee = XBee();

uint8_t payload[] = { 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x00000000, 0x00000000);
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();

int pin5 = 0;

int statusLed = 13;
int errorLed = 13;

void flashLed(int pin, int times, int wait) {

  for (int i = 0; i < times; i++) {
    digitalWrite(pin, HIGH);
    delay(wait);
    digitalWrite(pin, LOW);

    if (i + 1 < times) {
      delay(wait);
    }
  }
}

void setup() {
  pinMode(statusLed, OUTPUT);
  pinMode(errorLed, OUTPUT);

  xbee.begin(9600);
  dht.begin();
}

void loop() {   
  delay(3000);

  if (getPayload()){

    xbee.send(zbTx);
    // flash TX indicator
    flashLed(statusLed, 1, 100);

    // after sending a tx request, we expect a status response
    // wait up to half second for the status response
    if (xbee.readPacket(500)) {
      // got a response!

      // should be a znet tx status            	
      if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
        xbee.getResponse().getZBTxStatusResponse(txStatus);

        // get the delivery status, the fifth byte
        if (txStatus.getDeliveryStatus() == SUCCESS) {
          // success.  time to celebrate
          flashLed(statusLed, 5, 100);
        } 
        else {
          // the remote XBee did not receive our packet. is it powered on?
          flashLed(errorLed, 3, 500);
        }
      }
    } 
    else if (xbee.getResponse().isError()) {

    } 
    else {
      // local XBee did not provide a timely TX Status Response -- should not happen
      flashLed(errorLed, 2, 100);
    }
  }
}

boolean getPayload(){

  char* temp = getTemp();
  for(int i = 0;i<6;i++){
    payload[i] = temp[i];
  }

  //set humidity in payload
  char* humidity = getHum();
  for(int i = 6;i<12;i++){
    payload[i] = humidity[i-6];
  }

  if(temp[0] != 'F' && humidity[0] != 'F')
  {  
    return true;
  }

  return false;
}


char* getTemp()
{
  float t = dht.readTemperature();
  char* result = floatToCharArray(t);
  return result;
}

char* getHum()
{
  float h = dht.readHumidity();
  char* result = floatToCharArray(h);
  return result;
}


char* floatToCharArray(float value)
{
  char strVal[6]; 
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (!isnan(value)) {
    dtostrf(value, 2, 2, strVal); //make sure the precision is less than the total chars to avoid an overflow
  }
  else {
    strVal[0] = 'F'; // basic error code as result - yuk!  Must learn error handling in C...
  }
  return strVal;
}







